#include "lcd_init.h"
#include "delay.h"


/******************************************************************************
      函数说明：使用的端口模式初始化
      入口数据：
      返回值： 
        #define BLK	P14   //接转接板的BLK
        #define RES	P41  //接转接板的RES
        #define CS	P42  //接转接板的CS
        #define DC	P43  //接转接板的RS
        #define W_R	P20  //接转接板的WR
        #define R_D	P21  //接转接板的RD

        #define DATAOUT	P7	 //P00~P07
******************************************************************************/
void LCD_GPIO_Init(void) 
{	
	// P14 设置为推挽输出
	P1_MODE_OUT_PP(GPIO_Pin_4);	
}


/******************************************************************************
      函数说明：LCD串行数据写入函数
      入口数据：dat  要写入的串行数据
      返回值：  无
******************************************************************************/
void LCD_Writ_Bus(u8 dat) 
{	
	LCD_CS_Clr();
	LCD_WR_Clr();
	DATAOUT=dat;
	LCD_WR_Set();
	LCD_CS_Set();
}


/******************************************************************************
      函数说明：LCD写入数据
      入口数据：dat 写入的数据
      返回值：  无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
	LCD_Writ_Bus(dat);
}


/******************************************************************************
      函数说明：LCD写入数据
      入口数据：dat 写入的数据
      返回值：  无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
	LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
}


/******************************************************************************
      函数说明：LCD写入命令
      入口数据：dat 写入的命令
      返回值：  无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
	LCD_DC_Clr();//写命令
	LCD_Writ_Bus(dat);
	LCD_DC_Set();//写数据
}


/******************************************************************************
      函数说明：设置起始和结束地址
      入口数据：x1,x2 设置列的起始和结束地址
                y1,y2 设置行的起始和结束地址
      返回值：  无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
	if(USE_HORIZONTAL==0)
	{
		LCD_WR_REG(0x2a);//?????
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//?????
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//????
	}
	else if(USE_HORIZONTAL==1)
	{
		LCD_WR_REG(0x2a);//?????
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//?????
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//????
	}
	else if(USE_HORIZONTAL==2)
	{
		LCD_WR_REG(0x2a);//?????
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//?????
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//????
	}
	else
	{
		LCD_WR_REG(0x2a);//?????
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//?????
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//????
	}
}
/******************************************************************************
      函数说明：LCD初始化函数
      入口数据：无
      返回值：  无
******************************************************************************/
void LCD_Init(void)
{
	LCD_GPIO_Init();
	LCD_RES_Clr();		// 先执行复位操作
	delay_ms(200);		// 延时一段时间
	LCD_RES_Set();		// 关闭复位
	delay_ms(200);		// 延时
	LCD_BLK_Set();		// 打开背光
    delay_ms(200);
	
	/**
	 * 这个命令用于关闭sleep模式；
	*/
	LCD_WR_REG(0x11); 
	delay_ms(120); 
	
	/**
	 * 这个命令用于设置读写存储器的扫描方向，根据屏幕实际的方向设置不同的值；
	 * Page Address Order ： Top to Bottom
	 * Column Address Order ： Left to Right
	 * Page/Column Order ：Normal Mode
	 * Line Address Order ： LCD Refresh Top to Bottom
	 * RGB/BGR Order ： RGB
	 * Display Data Latch Data Order ：LCD Refresh Left to Right
	*/
	LCD_WR_REG(0x36); 
	if(USE_HORIZONTAL==0) 
	{
		LCD_WR_DATA8(0x00);
	}
	else if(USE_HORIZONTAL==1) 
	{
		LCD_WR_DATA8(0xC0);
	}
	else if(USE_HORIZONTAL==2) 
	{
		LCD_WR_DATA8(0x70);
	}
	else 
	{
		LCD_WR_DATA8(0xA0);
	}

	/**
	 * 这个命令用来设置RGB数据的格式
	 * This command is used to define the format of RGB picture data, 
	 * which is to be transferred via the MCU interface. T
	 * he formats are shown in the table:
	*/
	LCD_WR_REG(0x3A);
	LCD_WR_DATA8(0x05);

	/**
	 *  The back porch and front porch are used to set the RGB interface timi
	 * 后沿和前沿用来设置RGB接口的时序
	*/
	LCD_WR_REG(0xB2);
	LCD_WR_DATA8(0x0C);
	LCD_WR_DATA8(0x0C);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x33);
	LCD_WR_DATA8(0x33); 

	/**
	 * 液晶屏的VGH和VGL是指液晶屏的两个电压信号。
	 * VGH是液晶屏的高电压信号，用于控制液晶分子的取向，使其旋转到所需的角度。
	 * VGL是液晶屏的低电压信号，用于控制液晶分子的透过率，从而控制液晶屏的亮度。
	 * Gate Control
	 * 0011 0101
	 * VGH:13.26
	 * VGL:-10.43
	*/
	LCD_WR_REG(0xB7); 
	LCD_WR_DATA8(0x35);  

	/**
	 * 在液晶显示器中，vcom的作用是调节液晶屏的亮度和对比度。
	 * 具体来说，vcom的大小决定了液晶显示器中黑色和白色的亮度和对比度。
	 * 当vcom的电压高于一定值时，液晶屏会显示黑色；
	 * 当vcom的电压低于一定值时，液晶屏会显示白色。
	 * 因此，通过控制vcom的电压大小，可以调节液晶屏的亮度和对比度。
	 * VCOM Setting
	 * 0001 1001
	 * VCOM:0,729
	*/
	LCD_WR_REG(0xBB);
	LCD_WR_DATA8(0x19);

	/**
	 * LCM Control
	 * 0010 1100
	 * 	XMY: XOR MY setting in command 36h. 0
		XBGR: XOR RGB setting in command 36h. 1
		XREV: XOR inverse setting in command 21h
		XMH: this bit can reverse source output order and only support for RGB interface without RAM mode
		XMV: XOR MV setting in command 36h
		XMX: XOR MX setting in command 36h.
		XGS: XOR GS setting in command E4h.
	 * 
	*/
	LCD_WR_REG(0xC0);
	LCD_WR_DATA8(0x2C);

	/**
	 * VDV and VRH command write enable.
	 * 是否使能C3和C4命令；
	*/
	LCD_WR_REG(0xC2);
	LCD_WR_DATA8(0x01);

	/**
	 * 设置 VRH
	*/
	LCD_WR_REG(0xC3);
	LCD_WR_DATA8(0x12);   

	/**
	 * 设置VDV
	*/
	LCD_WR_REG(0xC4);
	LCD_WR_DATA8(0x20);  

	LCD_WR_REG(0xC6); 
	LCD_WR_DATA8(0x0F);    

	LCD_WR_REG(0xD0); 
	LCD_WR_DATA8(0xA4);
	LCD_WR_DATA8(0xA1);

	LCD_WR_REG(0xE0);
	LCD_WR_DATA8(0xD0);
	LCD_WR_DATA8(0x04);
	LCD_WR_DATA8(0x0D);
	LCD_WR_DATA8(0x11);
	LCD_WR_DATA8(0x13);
	LCD_WR_DATA8(0x2B);
	LCD_WR_DATA8(0x3F);
	LCD_WR_DATA8(0x54);
	LCD_WR_DATA8(0x4C);
	LCD_WR_DATA8(0x18);
	LCD_WR_DATA8(0x0D);
	LCD_WR_DATA8(0x0B);
	LCD_WR_DATA8(0x1F);
	LCD_WR_DATA8(0x23);

	LCD_WR_REG(0xE1);
	LCD_WR_DATA8(0xD0);
	LCD_WR_DATA8(0x04);
	LCD_WR_DATA8(0x0C);
	LCD_WR_DATA8(0x11);
	LCD_WR_DATA8(0x13);
	LCD_WR_DATA8(0x2C);
	LCD_WR_DATA8(0x3F);
	LCD_WR_DATA8(0x44);
	LCD_WR_DATA8(0x51);
	LCD_WR_DATA8(0x2F);
	LCD_WR_DATA8(0x1F);
	LCD_WR_DATA8(0x1F);
	LCD_WR_DATA8(0x20);
	LCD_WR_DATA8(0x23);

	LCD_WR_REG(0x21); 

	LCD_WR_REG(0x29); 
	
	LCD_BLK_Set();		// 打开背光
}








